// async函数

// ES2017 标准引入了 async 函数，使得异步操作变得更加方便。
// 不能离开promise的

// 以读取文件为例
// fs.readFile('./01-作业.html', 'utf8', (err, data) => {
//   console.log(data);
// });

// 如果要用async函数，先需要封装成promise函数
const fs = require("fs");
// const readFile = (url) => {
//   return new Promise((resolve, reject) => {
//     fs.readFile(url, 'utf8', (err, data) => {
//       resolve(data);
//     });
//   })
// }

// 传统的promise的写法
// readFile('./01-作业.html').then(res => {
//   console.log(res);
//   return readFile('./02-Promise.html')
// }).then(res => {
//   console.log(res);
// })


// async函数的使用
// 在function关键字的前面加上async关键字
// 箭头函数的话也在（）前面加上async关键字
// const fn = async function () {
  // await关键字
  // 当一个async函数从上往下执行的时候，每遇到一个await关键字，就会停下来
  // await关键字后面要放一个promise对象
  // 可以赋值给一个变量，这个变量就是之前的then函数里面的res
  // const res = await readFile('./01-作业.html');
  // console.log(res);
  // const res2 = await readFile('./02-Promise.html');
  // console.log(res2);

  // readFile('./01-作业.html').then(res => {
  //   console.log(res);
  // })
  // const res = await readFile('./01-作业.html');
  // console.log(res);
// }
// fn()







// 先直接打印123，再等待3秒钟，打印456,最后去读取"01-作业"的内容
const delay = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve()
    }, time)
  })
}
const readFile = (url) => {
  return new Promise((resolve, reject) => {
    fs.readFile(url, 'utf8', (err, data) => {
      if (err) {
        reject(err)
      } else {
        resolve(data)
      }
    });
  })
}
const fn2 = async () => {
  try {
    console.log(123);
    await delay(3000);
    console.log(456);
    // 如果漏掉了await关键字，res就变成了一个promise对象，而不是这个结果了
    // .than.catch是有办法处理错误的
    // await只能默认成功
    // 如果要想和catch一样捕捉错误，那么需要用到try...catch的方式
    const res = await readFile("./01-作.html");
    console.log(res);
  } catch(e) {
    if (e.message.includes("no such file or directory")) {
      console.log("文件名错误");
    }
  }

  
}
fn2();
